// 指的是将一个接受多个参数的函数 变为 接受一个参数返回一个函数的固定形式，这样便于再次调用，例如f(1)(2)
// 应用
// 参数复用
// 延迟计算或者运行
function add() {
	const _args = [ ...arguments ];
	function fn() {
		_args.push(...arguments);
		return fn;
	}
	fn.toString = function() {
		return _args.reduce((sum, cur) => sum + cur);
	};
	return fn;
}
console.log(add(1)(3).toString());

function curry(fn, args) {
	let length = fn.length;
	args = args || [];
	return function() {
		var _args = args.slice(0)
		_args.push(...arguments)
		if (_args.length < length) {
			return curry.call(this, fn, _args);
		} else {
			return fn.apply(this, _args);
		}
	};
}

var fn = curry(function(a, b, c) {
	console.log([ a, b, c ]);
});

// fn('a', 'b', 'c'); // ["a", "b", "c"]
// fn('a', 'b')('c'); // ["a", "b", "c"]
fn('a')('b')('c'); // ["a", "b", "c"]

// fn('a')('b', 'c'); // ["a", "b", "c"]

function mult(a, b) {
	return a * b;
}
